package 基础篇.创建线程;

import java.util.concurrent.Callable;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.FutureTask;

/**
 * 创建有返回值的线程
 */
public class CallableDemo {
    public static void main(String[] args) throws ExecutionException, InterruptedException {
        CallableDemo callableDemo=new CallableDemo();
        //https://www.cnblogs.com/baizhanshi/p/6425209.html 实现callable方式
        //下面是用的是lamba方式
        FutureTask<Integer> task=new FutureTask<Integer>((Callable<Integer>)()->{
            int i=0;
            for(;i<100;i++){
                System.out.println(Thread.currentThread().getName()+"value:"+i);
            }
            return i;
        });

        Thread t=new Thread(task,"有返回值线程");
        t.start();
        //task.get()返回任务中的返回值，调用该方法会导致程序阻塞，直到子线程结束后才会得到返回值
        //task.get(long,TimeUnit) 如果到达指定时间没有返回值则抛出TimeOutException
        System.out.println("子线程返回值:"+task.get());
        System.out.println("任务正常完成前被取消:"+task.isCancelled());
        System.out.println("任务已完成:"+task.isDone());
    }


}
